package com.fangsheng.redis.utils;

/**
 * @创建人: 放生
 * @创建时间: 2021/8/7
 * @描述:
 */
public class LuaScript {

    /**
     * availableQty（可用数） reserveQty（本次调用需要扣减的数）
     * local availableQty 是Lua脚本定义了一个全局变量（local 类似于 JavaScript中的 var）
     * tonumber（）是Lua脚本，把值转换为数字的函数
     *
     * 整个脚本的意思： 先根据传进来的key，判断key是否存在，如果存在就根据key获取出对应的值，用tonumber（）
     * 函数转换成一个number类型的值，并且把它赋值给变量availableQty，如果key不存在则return -2 直接结束
     *
     * 再根据外边传进来的值ARGV[1]，也通过转换，并把他赋值给变量reserveQty如果availableQty < reserveQty
     * 则返回-1表示失败，同时end  否则可用库存减去本次要扣减的库存，重新设置减之后的值，并返回0；同时end
     * @return
     */
    public static String substractScript() {
        StringBuilder sb = new StringBuilder();
        sb.append("if (redis.call('exists', KEYS[1]) == 1) then ");
        sb.append("local availableQty = tonumber(redis.call('get', KEYS[1])); ");
        sb.append("local reserveQty = tonumber(ARGV[1]); ");
        sb.append("if(availableQty < reserveQty) then ");
        sb.append("return -1; end; ");
        sb.append("redis.call('set', KEYS[1], availableQty - reserveQty);");
        sb.append("return 0; end;");
        sb.append("return -2; ");
        return sb.toString();
    }


    /**
     * 增加可用库存
     *
     * 1.获取可用库存数
     * 2.计算
     * 3.修改
     */
    public static String addScript() {
        StringBuilder sb = new StringBuilder();
        sb.append("local availableQty; ");
        sb.append("if (redis.call('exists', KEYS[1]) == 1) then ");
        sb.append("availableQty = tonumber(redis.call('get', KEYS[1])); ");
        sb.append("else ");
        sb.append("availableQty = 0;");
        sb.append("end ");
        sb.append("local availableQtyAfter = availableQty + tonumber(ARGV[1]); ");
        sb.append("redis.call('set', KEYS[1], availableQtyAfter); ");
        sb.append("return 0;");
        return sb.toString();
    }



}
